package es.efor.ics.gev.service.impl;

import java.util.List;
import java.util.Map;
import java.util.SortedMap;

import org.springframework.beans.factory.annotation.Autowired;

import es.efor.ics.gev.dao.AtributoMaestroDao;
import es.efor.ics.gev.dao.OrganizacionDao;
import es.efor.ics.gev.dao.PerfilDao;
import es.efor.ics.gev.model.AtributoInformado;
import es.efor.ics.gev.model.AtributoMaestro;
import es.efor.ics.gev.model.AtributoPerfil;
import es.efor.ics.gev.model.Organizacion;
import es.efor.ics.gev.model.Perfil;
import es.efor.ics.gev.model.PerfilOrganizacion;
import es.efor.ics.gev.model.PerfilOrganizativo;
import es.efor.ics.gev.service.OrganizacionManager;

public class OrganizacionManagerImpl extends
		GenericManagerImpl<Organizacion, Long> implements OrganizacionManager {

	@Autowired
	PerfilDao perfilDao;

	@Autowired
	AtributoMaestroDao atributoDao;

	OrganizacionDao organizacionDao;

	@Autowired
	public void setOrganizacionDao(OrganizacionDao organizacionDao) {
		this.dao = organizacionDao;
		this.organizacionDao = organizacionDao;
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizaciones() {
		return organizacionDao.getOrganizaciones();
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByCIF(String cif) {
		return organizacionDao.getOrganizacionesByCIF(cif);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByCIFAndRazonSocial(String cif,
			String razonSocial) {
		return organizacionDao.getOrganizacionesByCIFAndRazonSocial(cif,
				razonSocial);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByCIFAndRazonSocialAndPerfil(
			String cif, String razonSocial, Long perfilId) {
		return organizacionDao.getOrganizacionesByCIFAndRazonSocialAndPerfil(
				cif, razonSocial, perfilId);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByCIFAndRazonSocialAndPerfil(
			String cif, String razonSocial, String nombrePerfil) {
		return organizacionDao.getOrganizacionesByCIFAndRazonSocialAndPerfil(
				cif, razonSocial, nombrePerfil);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByPerfil(Long perfilId) {
		return organizacionDao.getOrganizacionesByPerfil(perfilId);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByPerfil(String nombrePerfil) {
		return organizacionDao.getOrganizacionesByPerfil(nombrePerfil);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Organizacion> getOrganizacionesByRazonSocial(String razonSocial) {
		return organizacionDao.getOrganizacionesByRazonSocial(razonSocial);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion getOrganizacionByCif(String cif) {
		return organizacionDao.getOrganizacionByCif(cif);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion createOganizacion(String cif, String razonSocial,
			List<PerfilOrganizativo> perfiles) {
		return organizacionDao.createOrganizacion(cif, razonSocial, perfiles);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion createOrganizacion(String cif, String razonSocial,
			List<Organizacion> organizacionesHijo,
			List<PerfilOrganizativo> perfiles) {
		return organizacionDao.createOrganizacion(cif, razonSocial,
				organizacionesHijo, perfiles);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<Perfil> getPerfilesOrganizacion(String organizacionId) {
		return organizacionDao.getPerfilesOrganizacion(new Long(organizacionId));
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion addPerfil(Organizacion organizacion, Perfil perfil) {
		return organizacionDao.addPerfil(organizacion,
				(PerfilOrganizativo) perfil);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion addPerfil(String organizacionId, String perfilId) {		
		return organizacionDao.addPerfil(get(new Long(organizacionId)),
				perfilDao.getPerfilOrganizativo((new Long(perfilId))));
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion removePerfil(Organizacion organizacion, PerfilOrganizativo perfil) {
		return organizacionDao.removePerfil(organizacion,
				perfil);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion removePerfil(String organizacionId, String perfilId) {
		return organizacionDao.removePerfil(get(new Long(organizacionId)),
				perfilDao.getPerfilOrganizativo((new Long(perfilId))));
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion updatePerfiles(Organizacion organizacion,
			List<PerfilOrganizativo> perfiles) {
		return organizacionDao.updatePerfiles(organizacion, perfiles);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion updatePerfiles(String organizacionId,
			List<PerfilOrganizativo> perfiles) {
		return organizacionDao.updatePerfiles(get(new Long(organizacionId)),
				perfiles);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<AtributoMaestro> getAtributosOrganizacion(String organizacionId) {
		return organizacionDao
				.getAtributosOrganizacion(new Long(organizacionId));
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion setValorAtributoOrganizacion(Organizacion org,
			AtributoMaestro atributo, String valor) {
		log.debug("setting valor: " + valor + " to atributo: "
				+ atributo.getId());
		return organizacionDao.setValorAtributoOrganizacion(org, atributo,
				valor);
	}

	/**
	 * {@inheritDoc}
	 */
	public SortedMap<AtributoPerfil, String> getMapAtributosOrganizacion(
			String organizacionId, String perfilId) {
		return organizacionDao.getMapAtributosOrganizacion(get(new Long(
				organizacionId)), perfilDao.get(new Long(perfilId)));
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion setValoresAtributosOrganizacion(Organizacion org,
			Map<AtributoMaestro, String> mapValores) {
		return organizacionDao.setValoresAtributosOrganizacion(org, mapValores);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion setValoresAtributosOrganizacion(String organizacionId,
			Map<AtributoMaestro, String> mapValores) {
		return organizacionDao.setValoresAtributosOrganizacion(get(new Long(
				organizacionId)), mapValores);
	}

	/**
	 * {@inheritDoc}
	 */
	public Organizacion setValorAtributoOrganizacion(String organizacionId,
			String atributoId, String valor) {
		return organizacionDao.setValorAtributoOrganizacion(get(new Long(
				organizacionId)), atributoDao.get(new Long(atributoId)), valor);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<AtributoInformado> getValoresAtributosPerfil(Organizacion org,
			Perfil perfil) {
		return organizacionDao.getValoresAtributosPerfil(org, perfil);
	}

}
